{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fd31ad6f-ec30-49b4-9859-21e11f02a2d8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:24.715340Z",
     "start_time": "2022-02-20T08:52:48.755727Z"
    }
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad3a50ed-3b0d-4ac7-9c21-e5733dff787a",
   "metadata": {},
   "source": [
    "# 梯度消失和梯度爆炸"
   ]
  },
  {
   "attachments": {
    "1a1fd87d-d328-4161-92aa-445ee9fe66b2.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "dd1980fc-7bec-4b20-8039-33eeec0a69b0",
   "metadata": {},
   "source": [
    "![image.png](attachment:1a1fd87d-d328-4161-92aa-445ee9fe66b2.png)\n",
    "\n",
    "例如使用sigmoid函数作为激活函数，传统的权重初始化方法，如标准正态分布下，每一层输出的方差都远大于其输入的方差，随着网络的延申，方差会不断增加，直到激活函数达到饱和。\n",
    "\n",
    "输入过大或过小时，其导数几乎为0，难以反向传播，此时饱和，为梯度消失，反向传播通过顶层向下传播时，存在的小梯度不断被稀释，因此对于底层来说什么都没有留下。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98aead40-4404-46c5-9253-7b478e574a84",
   "metadata": {},
   "source": [
    "## Glorot和He初始化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1dcb6a6",
   "metadata": {},
   "source": [
    "权重初始化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a301ad6-de75-4296-b7c6-ea8b59a5c32b",
   "metadata": {},
   "source": [
    "$fan_{avg} = (fan_{in} + fan_{out}) / 2$ ，其中$fan_{in}$是该层的扇入，$fan_{in}$是扇出\n",
    "\n",
    "Glorot初始化（sigmoid激活函数）\n",
    "\n",
    "正态分布，均值为0，方差为 $\\sigma^2=\\frac{1}{fan_{avg}}$\n",
    "\n",
    "或$-r$到$+r$之间的均匀分布，其中 $r = \\sqrt{\\frac{3}{fan_{avg}}}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "62879e4c-6669-4676-baad-da731e0130da",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:24.731290Z",
     "start_time": "2022-02-20T08:53:24.718290Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Constant',\n",
       " 'GlorotNormal',\n",
       " 'GlorotUniform',\n",
       " 'HeNormal',\n",
       " 'HeUniform',\n",
       " 'Identity',\n",
       " 'Initializer',\n",
       " 'LecunNormal',\n",
       " 'LecunUniform',\n",
       " 'Ones']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[name for name in dir(keras.initializers) if not name.startswith(\"_\")][:10]  # 一些可选择的初始化参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c928b8be",
   "metadata": {},
   "source": [
    "## 非饱和激活函数"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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Ku76ZycmJvprH2pqavzPldY5Ja2TUK1WKxaLBafTidvtvuljFhERQUZGBufPn6esrIzGxkb/c+/o0aO0tLT452mItNLKg9w2l8tFdXU1+fn51/y91WrFZrMxe/ZsduzYwYYNG3C73cydO5eYmBiqq6s5duwYAI8//jg2m42EhASOHTvGrl27yM7OxuFw8N5777Fjx44btlIGBwczfvx4XnzxRd555x1+9atfYbVa/YWVwcHBpKWlMWrUKN555x1iY2MZOHDg12obCw0NJT09nUmTJnHw4EH69evH5MmTWbRoET/96U955513uHLlCoMGDcLr9VJUVER+fj4jRozgvvvu8/+cxsZGLl269JXHLiwsjMjISB555BFefvllVq1aRXNzs39/fseOHezcuZMJEyYwderUm8aakJCA2+0mNzeXAwcOkJyczOHDh9mwYQPnz5+nb9++/u8dOXIkubm5vPfee8TFxfm7LSorKyksLGTRokWEhYURERGB2Wzmiy++YPTo0fTq1eumb7zBwcFMmjSJXr16sWPHDhISEhg8eDDp6en+/89ms5GYmOhvN4yJicHhcLB161YOHDhwzadfs9lM79692bt3LxcvXuTy5ctERkYSHh5+3W2c0aNHk5OTwwcffMD/+l//i6effhqTycS6devYvn079913HxkZGe2aPFgsFvr06eNvX12zZg1LliyhoqKCVatWcfToUTIyMu7qZ48YMYL8/Hx+8Ytf8NprrzFv3jwyMjJoaGigqKiIUaNGkZycTEREBEFBQeTl5fnbSMPDw6+bQPTp04dZs2axYsUKVqxYgcPhICcnh3PnzvH666+Tnp7OPffcE5AhZdJ5KXmQ21ZZWcnx48e/cpZBXFwcEydOZNmyZXzve9/zd0vs2bMHk8lEaGgoUVFRjBs3zp8YLFiwAIB9+/Zx/PhxIiIi6N+/P9nZ2dd8Sv4yk8lEcHAwY8aMwel0sn79ev7P//k/eDwe/yfbpKQkHnzwQXbt2sWIESMYNGjQ15r2ZzKZiIiIYMGCBfzyl7/k0KFDjBw5kgcffJD6+npOnDjBG2+84V8iDw8P97cjftnJkyc5d+4cK1euvObvhw4dysyZM5k8eTIvvfQSubm5/O53v8Pj8fjnTjz00EPMnDnzmjf/6xk7dixFRUWsX7+en/70p4SGhpKYmEhcXByjR4++5nEd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"
    }
   },
   "cell_type": "markdown",
   "id": "6a273ff1",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "274f1307",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:24.747248Z",
     "start_time": "2022-02-20T08:53:24.734248Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['deserialize',\n",
       " 'elu',\n",
       " 'exponential',\n",
       " 'gelu',\n",
       " 'get',\n",
       " 'hard_sigmoid',\n",
       " 'linear',\n",
       " 'relu',\n",
       " 'selu',\n",
       " 'serialize',\n",
       " 'sigmoid',\n",
       " 'softmax',\n",
       " 'softplus',\n",
       " 'softsign',\n",
       " 'swish',\n",
       " 'tanh']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[m for m in dir(keras.activations) if not m.startswith(\"_\")]\n",
    "# 一些可用的激活函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "901d674c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:24.763172Z",
     "start_time": "2022-02-20T08:53:24.750206Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['LeakyReLU', 'PReLU', 'ReLU', 'ThresholdedReLU']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[m for m in dir(keras.layers) if \"relu\" in m.lower()]\n",
    "# 可用的激活函数中ReLU的变体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4c451fa5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:25.411717Z",
     "start_time": "2022-02-20T08:53:24.765165Z"
    }
   },
   "outputs": [],
   "source": [
    "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()\n",
    "X_train_full = X_train_full / 255.0\n",
    "X_test = X_test / 255.0\n",
    "X_valid, X_train = X_train_full[:5000], X_train_full[5000:]\n",
    "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "cbdb6c64",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:27.613939Z",
     "start_time": "2022-02-20T08:53:25.413430Z"
    }
   },
   "outputs": [],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, kernel_initializer=\"he_normal\"),\n",
    "    keras.layers.LeakyReLU(),  # 给前面一层用LeakyReLU激活函数\n",
    "    # keras.layers.PReLU()， PReLU激活函数同理\n",
    "    # keras.layers.Dense(10, activation=\"elu\") elu激活函数\n",
    "    keras.layers.Dense(100, kernel_initializer=\"he_normal\"),\n",
    "    keras.layers.LeakyReLU(),  # 同理\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "              metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a192f8e1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:57.089849Z",
     "start_time": "2022-02-20T08:53:27.615600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 1.2819 - accuracy: 0.6229 - val_loss: 0.8886 - val_accuracy: 0.7160\n",
      "Epoch 2/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.7955 - accuracy: 0.7362 - val_loss: 0.7130 - val_accuracy: 0.7658\n",
      "Epoch 3/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.6816 - accuracy: 0.7720 - val_loss: 0.6427 - val_accuracy: 0.7898\n",
      "Epoch 4/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.6217 - accuracy: 0.7944 - val_loss: 0.5900 - val_accuracy: 0.8066\n",
      "Epoch 5/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.5832 - accuracy: 0.8074 - val_loss: 0.5582 - val_accuracy: 0.8200\n",
      "Epoch 6/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.5553 - accuracy: 0.8156 - val_loss: 0.5350 - val_accuracy: 0.8238\n",
      "Epoch 7/10\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.5338 - accuracy: 0.8225 - val_loss: 0.5157 - val_accuracy: 0.8304\n",
      "Epoch 8/10\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.5173 - accuracy: 0.8273 - val_loss: 0.5079 - val_accuracy: 0.8284\n",
      "Epoch 9/10\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.5040 - accuracy: 0.8289 - val_loss: 0.4895 - val_accuracy: 0.8390\n",
      "Epoch 10/10\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4924 - accuracy: 0.8321 - val_loss: 0.4817 - val_accuracy: 0.8396\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=10,\n",
    "                    validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "attachments": {
    "fdba31a2-a84d-4f09-89c0-2f867708f330.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAFXCAYAAABTKh8uAAAgAElEQVR4nOzdd3iU553u8e/MqPeGBAIJJLooxghTDBiDwSY2tnEvYK8r2SSbdbLZsyebPbtnk90T56Reu5tsmhM77hgbDKYbF2wwtmmmI6pAAiHUNdL0cv54zoyRAZv+aqT7c13vNaNRmUdT73nK77GFw+EwIiIiIjHGbnUDRERERC6EQoyIiIjEJIUYERERiUkKMSIiIhKTFGJEREQkJinEiIiISExSiBEREZGYpBAjIiIiMSnO6gaIdHdLlixhz5499O3bl/vvv/+KX/+hQ4dYvHgx7e3t3HvvvQwaNOiKtyEcDrNx40ZWrVrF7t27cblczJ07lylTppCfn3/F2/Nl2tvbefnll6mrq2PixIlMmTLFknYEAgFqa2t5+umnufPOOxk7dixpaWmWtOViHDhwgDfffJN+/foxadIkevbsaXWTJIYoxIglPB4P77//Pnv27KG1tfW076enpzN8+HCuu+463n//fVpaWigrK2PEiBFn/Hsul4ulS5cSHx/P8OHDGThwYIfvnzhxgu3bt7N3714ee+yxK/piX1VVxXvvvUdOTg5jx4497U05OzubwsJCcnNzL1sb3nnnHRobGykpKWHMmDEdvpeUlETPnj3xeDwkJydftjZ8mePHj/Puu++ybt06Bg0aRGJiIrm5ucTFWfcSdbb7zW63k5+fT0JCAhkZGZa1r6GhgbVr13LgwAH8fj8Oh8OytnxRc3MzlZWV7Ny5k/r6etra2hgwYABjx46ltLS0w886HA5sNhsLFiygsLCQvLw8S+93iS16pIglPB4PK1euZM2aNdjt9tM+ffXo0YO0tDTGjh3LypUrOXr0KHffffeXhpjXXnuN1NRUEhMTzxhiVq1axZIlS7jnnnuueIh5/vnnGTBgAH379j0txIwdO5bRo0df1jehd955hwMHDnDDDTecFmIKCgq47bbbABNorHDo0CF27NiBw+Hg29/+Nrm5uaSmppKQkGBJe+Ds91tSUhI33ngjoVCI+Ph4S9oWCoU4evQoy5Yto7y8nH79+lkWQM+kqamJbdu2sXLlSpqbm9m6dSvXXnstPXr0OC3E9OzZk+uvv54XXniBvXv3MnDgQHr06GFRyyXWKMSIpUpLS7n55pu58847O1zucDhISkrC7/df8TaF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"
    }
   },
   "cell_type": "markdown",
   "id": "f341c215",
   "metadata": {},
   "source": [
    "![image.png](attachment:fdba31a2-a84d-4f09-89c0-2f867708f330.png)"
   ]
  },
  {
   "attachments": {
    "9351775f-4a40-4201-861c-f27245ba412c.png": {
     "image/png": "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bAyuuBw5coSqqiruuusuYmJiKCkpoaKigsbGRoqLi2lra8NsNpOTk8OoUaM4fvw4v/vd70hPTw++4F24cIG33nqLgwcP0tDQABirGHv37sXr9TJx4kSSkpJwOBw899xzpKWlkZmZic/no6ysjNbWVvbu3cvixYtZsGDBZX++fr+fmpoajh8/Hly5OXDgADabjSlTpuD1elm3bh0nT55k/vz5wWSisbGRPXv28Ic//IFhw4YxePBgampq2LBhAx9++CGzZs3CYrFw5swZmpub8fl8OJ1O5syZw8CBA/H5fFRUVPDBBx+wb98+Lly4gN/vx2q1kpaWRlJSEv379+eLL77A7XZTXl6O3++npKSEQYMG4Xa7OXPmDG+++SaBQCCYTNTX17Njxw4++ugjysvLg19namoqZWVl3HPPPaSkpGAymfj0009ZuXIld955Jx6Ph/Pnz1NfX09MTAynT5/mO9/5DqmpqSFfnZGeScmEdFtms5nY2FjS0tI4efIkhw8fJjk5mejoaCwWCzabDYvFcsnF0ePx0NjYSEVFRYePR0ZGEhsbS3R09HVdeg8EApjNZiZNmkR2djapqanU1NSwadMmnnnmGQYMGEBaWhppaWk0NjbyH//xHxQUFDB16lTuuusuMjIyqKqqorq6mtTUVIYMGcL3v/99fvKTn/DYY49x2223YbfbsdlsHVY4AKxWK5MmTSIxMZHS0lIKCwuZMmUKYKwAnD59moaGBmbOnInNZqOxsZHMzEyWLl3K4MGDsdls7N27l1dffZWVK1dyww03MHToUJYvX05VVRVer5dFixaxbNkyYmJigqtGf6+pqYm9e/fyzDPPMH/+fB588EHS09M5ePAgv/3tb7HZbMTExHDTTTcFb/P555+TkJDAsmXLGDp0KPv37+ePf/wjGzZsYMSIEYwaNeqSx7FarUyePBm73U4gEODs2bM8/fTTwRf0Xbt2fa2fnd/vp7q6mqKiIpYtW8bDDz9MZWUlv/rVr3j//fdJSUlh4MCBtLW1sW7dOl555RUGDhzIo48+yujRo2lra+PYsWP06dOHESNG8Otf/5rPPvuMO+64I/h1RUZGkpCQcNnHP3ToEGvXrqWkpIQnnniCcePGceLECV599VVef/11MjMzmTdvXnDrrrKykq1bt/K9732PRx55hNLSUtasWcN//ud/Mnv2bOx2+yW/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"
    }
   },
   "cell_type": "markdown",
   "id": "4493e262",
   "metadata": {},
   "source": [
    "![image.png](attachment:9351775f-4a40-4201-861c-f27245ba412c.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e6e601c",
   "metadata": {},
   "source": [
    "> 对于SELU激活，创建层时设置activation=\"selu\",kernel_initializer=\"lecun_normal\"，ReLU及其变体用he初始化\n",
    "```\n",
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "model.add(keras.layers.Dense(300, activation=\"selu\",\n",
    "                             kernel_initializer=\"lecun_normal\"))\n",
    "for layer in range(99):\n",
    "    model.add(keras.layers.Dense(100, activation=\"selu\",\n",
    "                                 kernel_initializer=\"lecun_normal\"))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7eaf915",
   "metadata": {},
   "source": [
    "## 批量归一化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30e0f047-475e-4926-ac7b-aece84e6dd07",
   "metadata": {},
   "source": [
    "1. $\\mu_B = \\frac{1}{m_{B}}\\sum^{m_B}_{i=1}x^{(i)} $\n",
    "2. $\\sigma^2 = \\frac{1}{m_{B}}\\sum^{m_B}_{i=1}(x^{(i)}-\\mu_B)^2 $\n",
    "3. $\\hat{x}^{(i)} = \\frac{x^{(i)}-\\mu_B}{\\sqrt{\\sigma_b^{(B)}+\\epsilon}} $\n",
    "4. $z^{(i)} = \\gamma\\otimes\\hat{x}^{(i)}+\\beta $  ，(逐元素乘法)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b0735ae2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:57.151764Z",
     "start_time": "2022-02-20T08:53:57.091568Z"
    }
   },
   "outputs": [],
   "source": [
    "'''\n",
    "在激活函数之后归一化\n",
    "'''\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.BatchNormalization(),  # 每一层中间都批量归一化\n",
    "    keras.layers.Dense(300, activation='relu', kernel_initializer='he_normal'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Dense(100, activation='relu', kernel_initializer='he_normal'),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Dense(10, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "bd5c6bfd-9626-4fcb-a5d8-763a6765bd49",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:57.197247Z",
     "start_time": "2022-02-20T08:53:57.153365Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " flatten_1 (Flatten)         (None, 784)               0         \n",
      "                                                                 \n",
      " batch_normalization (BatchN  (None, 784)              3136      \n",
      " ormalization)                                                   \n",
      "                                                                 \n",
      " dense_3 (Dense)             (None, 300)               235500    \n",
      "                                                                 \n",
      " batch_normalization_1 (Batc  (None, 300)              1200      \n",
      " hNormalization)                                                 \n",
      "                                                                 \n",
      " dense_4 (Dense)             (None, 100)               30100     \n",
      "                                                                 \n",
      " batch_normalization_2 (Batc  (None, 100)              400       \n",
      " hNormalization)                                                 \n",
      "                                                                 \n",
      " dense_5 (Dense)             (None, 10)                1010      \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 271,346\n",
      "Trainable params: 268,978\n",
      "Non-trainable params: 2,368\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2af70469-5d0d-4afb-ba22-b23d0b65ad99",
   "metadata": {},
   "source": [
    "批量归一化层（BN层）每个扇入增加四个参数，因此每一层增加（扇入\\*4）个参数，其中 $\\mu$ 和 $\\sigma$ 是移动平均值，不受反向传播影响，因此BN层有一半的参数为非训练参数（但也是估算出来的，因此也可以认为是半训练参数）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0dea7102-e53d-47ff-b285-2717f984f2b5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:57.213205Z",
     "start_time": "2022-02-20T08:53:57.200242Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('batch_normalization/gamma:0', True),\n",
       " ('batch_normalization/beta:0', True),\n",
       " ('batch_normalization/moving_mean:0', False),\n",
       " ('batch_normalization/moving_variance:0', False)]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[(var.name, var.trainable) for var in model.layers[1].variables]  # 检查参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ef36b049-b42d-4e23-ab9b-4f16f9754299",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:53:57.228165Z",
     "start_time": "2022-02-20T08:53:57.215201Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "              metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "456003ae-f92a-4777-bc9e-21055b6b4441",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:54:55.423402Z",
     "start_time": "2022-02-20T08:53:57.231157Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.9123 - accuracy: 0.6962 - val_loss: 0.5906 - val_accuracy: 0.8036\n",
      "Epoch 2/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.6127 - accuracy: 0.7894 - val_loss: 0.5002 - val_accuracy: 0.8336\n",
      "Epoch 3/10\n",
      "1719/1719 [==============================] - 4s 3ms/step - loss: 0.5484 - accuracy: 0.8106 - val_loss: 0.4618 - val_accuracy: 0.8422\n",
      "Epoch 4/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.5075 - accuracy: 0.8235 - val_loss: 0.4382 - val_accuracy: 0.8508\n",
      "Epoch 5/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.4800 - accuracy: 0.8327 - val_loss: 0.4223 - val_accuracy: 0.8558\n",
      "Epoch 6/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.4640 - accuracy: 0.8375 - val_loss: 0.4101 - val_accuracy: 0.8612\n",
      "Epoch 7/10\n",
      "1719/1719 [==============================] - 8s 4ms/step - loss: 0.4495 - accuracy: 0.8426 - val_loss: 0.3988 - val_accuracy: 0.8614\n",
      "Epoch 8/10\n",
      "1719/1719 [==============================] - 6s 3ms/step - loss: 0.4372 - accuracy: 0.8456 - val_loss: 0.3923 - val_accuracy: 0.8650\n",
      "Epoch 9/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.4250 - accuracy: 0.8493 - val_loss: 0.3857 - val_accuracy: 0.8652\n",
      "Epoch 10/10\n",
      "1719/1719 [==============================] - 6s 3ms/step - loss: 0.4155 - accuracy: 0.8532 - val_loss: 0.3799 - val_accuracy: 0.8666\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44a814a3-f077-4cbb-9ada-8ff1f25bb091",
   "metadata": {},
   "source": [
    "相对于之前的，训练速度慢了，之前2秒，现在4秒，但在超大型数据中，实际上差不多甚至更短"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "629ed944-6c7b-43ec-9e41-2a43e9aceb6f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:54:55.503189Z",
     "start_time": "2022-02-20T08:54:55.425397Z"
    }
   },
   "outputs": [],
   "source": [
    "'''\n",
    "在激活函数前归一化\n",
    "'''\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=(28, 28)),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Dense(300, kernel_initializer='he_normal', use_bias=False),\n",
    "    # 取消偏置项，在归一化中已经加了偏置项\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Activation('relu'),\n",
    "    keras.layers.Dense(100, kernel_initializer='he_normal', use_bias=False),\n",
    "    keras.layers.BatchNormalization(),\n",
    "    keras.layers.Activation('relu'),\n",
    "    keras.layers.Dense(10, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "35645772-c5ed-4b92-840b-0e64912c4efa",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:54:55.519146Z",
     "start_time": "2022-02-20T08:54:55.504187Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(loss='sparse_categorical_crossentropy',\n",
    "             optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "             metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8d878a16-8ba4-4995-ad31-61d460b25784",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:55:49.984977Z",
     "start_time": "2022-02-20T08:54:55.520143Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1719/1719 [==============================] - 7s 3ms/step - loss: 1.0803 - accuracy: 0.6511 - val_loss: 0.7036 - val_accuracy: 0.7748\n",
      "Epoch 2/10\n",
      "1719/1719 [==============================] - 6s 3ms/step - loss: 0.7053 - accuracy: 0.7708 - val_loss: 0.5808 - val_accuracy: 0.8098\n",
      "Epoch 3/10\n",
      "1719/1719 [==============================] - 6s 4ms/step - loss: 0.6226 - accuracy: 0.7932 - val_loss: 0.5226 - val_accuracy: 0.8266\n",
      "Epoch 4/10\n",
      "1719/1719 [==============================] - 6s 3ms/step - loss: 0.5684 - accuracy: 0.8089 - val_loss: 0.4872 - val_accuracy: 0.8392\n",
      "Epoch 5/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.5333 - accuracy: 0.8176 - val_loss: 0.4619 - val_accuracy: 0.8482\n",
      "Epoch 6/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.5109 - accuracy: 0.8243 - val_loss: 0.4424 - val_accuracy: 0.8530\n",
      "Epoch 7/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.4934 - accuracy: 0.8302 - val_loss: 0.4280 - val_accuracy: 0.8578\n",
      "Epoch 8/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.4780 - accuracy: 0.8341 - val_loss: 0.4171 - val_accuracy: 0.8622\n",
      "Epoch 9/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.4644 - accuracy: 0.8390 - val_loss: 0.4079 - val_accuracy: 0.8628\n",
      "Epoch 10/10\n",
      "1719/1719 [==============================] - 5s 3ms/step - loss: 0.4534 - accuracy: 0.8428 - val_loss: 0.3995 - val_accuracy: 0.8648\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c0065f55-22c2-4c93-b5fd-8876212f15b3",
   "metadata": {},
   "source": [
    "## 梯度裁剪"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "de7d81e8-84df-4ead-83a9-6f7eef6633ec",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:55:50.000867Z",
     "start_time": "2022-02-20T08:55:49.985905Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.SGD(clipvalue=1.0)  \n",
    "# 按值裁剪，原始梯度向量为[0.9, 100]，则裁剪为[0.9, 1]，范围限定在[-1, 1]\n",
    "optimizer = keras.optimizers.SGD(clipnorm=1.0)\n",
    "# 按范数裁剪，原始梯度向量为[0.9, 100]，则裁剪为[0.00899964, 0.9999595]，第一个分量基本被消除，但方向保留\n",
    "model.compile(loss='mse', optimizer=optimizer)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a04f887",
   "metadata": {},
   "source": [
    "效果可以在tensorboard比较"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7e69414",
   "metadata": {},
   "source": [
    "# 重用预训练层"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8665b399",
   "metadata": {},
   "source": [
    "## 用Keras进行迁移学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e73d625",
   "metadata": {},
   "source": [
    "假设Fashion MNIST数据集仅包含除凉鞋和衬衫以外的类别，通过训练该数据集建立模型，效果不错，大于90%，称之为模型A；\n",
    "\n",
    "我们要训练一个二元分类器（正：衬衫，负：凉鞋），我们的数据集很小，只有200张带标签的图像，当我们使用与模型A相同构架的模型训练时，称为模型B，效果很好，有97%的精度，我们再考虑用迁移学习进一步提高精度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "31e290c5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:55:50.237429Z",
     "start_time": "2022-02-20T08:55:50.002860Z"
    }
   },
   "outputs": [],
   "source": [
    "def split_dataset(X, y): # 用于重整数据\n",
    "    y_5_or_6 = (y == 5) | (y == 6) # 凉鞋或衬衫\n",
    "    y_A = y[~y_5_or_6]  # ~ 取非运算符，即取非凉鞋或衬衫\n",
    "    y_A[y_A > 6] -= 2 # 7,8,9重新标记为5,6,7，即减去2，剩下8类\n",
    "    y_B = (y[y_5_or_6] == 6).astype(np.float32) # 重新标记为是否为6（衬衫）\n",
    "    return ((X[~y_5_or_6], y_A),\n",
    "            (X[y_5_or_6], y_B))\n",
    "\n",
    "(X_train_A, y_train_A), (X_train_B, y_train_B) = split_dataset(X_train, y_train)\n",
    "(X_valid_A, y_valid_A), (X_valid_B, y_valid_B) = split_dataset(X_valid, y_valid)\n",
    "(X_test_A, y_test_A), (X_test_B, y_test_B) = split_dataset(X_test, y_test)\n",
    "X_train_B = X_train_B[:200]\n",
    "y_train_B = y_train_B[:200]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "6f530481",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:55:50.252386Z",
     "start_time": "2022-02-20T08:55:50.239385Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(43986, 28, 28)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_A.shape  # 模型A的训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "960d8fa7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:55:50.268342Z",
     "start_time": "2022-02-20T08:55:50.253345Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(200, 28, 28)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_B.shape  # 模型B的训练数据，只有200个"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea6a8280",
   "metadata": {},
   "source": [
    "### 模型A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c0d86485",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:57:49.653708Z",
     "start_time": "2022-02-20T08:57:49.422055Z"
    }
   },
   "outputs": [],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "model_A = keras.models.Sequential()\n",
    "model_A.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "for n_hidden in [300, 300, 100, 100, 50]:\n",
    "    model_A.add(keras.layers.Dense(n_hidden, activation='selu'))\n",
    "model_A.add(keras.layers.Dense(8 ,activation='softmax'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "657b791a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:57:50.833128Z",
     "start_time": "2022-02-20T08:57:50.813140Z"
    }
   },
   "outputs": [],
   "source": [
    "model_A.compile(loss='sparse_categorical_crossentropy',\n",
    "               optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "               metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f3d56ebe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:22.077947Z",
     "start_time": "2022-02-20T08:57:50.975705Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1375/1375 [==============================] - 4s 2ms/step - loss: 0.5253 - accuracy: 0.8249 - val_loss: 0.3671 - val_accuracy: 0.8732\n",
      "Epoch 2/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.3335 - accuracy: 0.8828 - val_loss: 0.3131 - val_accuracy: 0.8886\n",
      "Epoch 3/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.3018 - accuracy: 0.8932 - val_loss: 0.2886 - val_accuracy: 0.8996\n",
      "Epoch 4/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2844 - accuracy: 0.9015 - val_loss: 0.2768 - val_accuracy: 0.9046\n",
      "Epoch 5/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2720 - accuracy: 0.9056 - val_loss: 0.2677 - val_accuracy: 0.9091\n",
      "Epoch 6/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2628 - accuracy: 0.9094 - val_loss: 0.2628 - val_accuracy: 0.9098\n",
      "Epoch 7/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2550 - accuracy: 0.9121 - val_loss: 0.2632 - val_accuracy: 0.9088\n",
      "Epoch 8/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2488 - accuracy: 0.9150 - val_loss: 0.2514 - val_accuracy: 0.9148\n",
      "Epoch 9/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2436 - accuracy: 0.9162 - val_loss: 0.2461 - val_accuracy: 0.9195\n",
      "Epoch 10/10\n",
      "1375/1375 [==============================] - 3s 2ms/step - loss: 0.2389 - accuracy: 0.9182 - val_loss: 0.2475 - val_accuracy: 0.9160\n"
     ]
    }
   ],
   "source": [
    "history = model_A.fit(X_train_A, y_train_A, epochs=10, validation_data=(X_valid_A, y_valid_A))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27f2eba9",
   "metadata": {},
   "source": [
    "### 模型B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "5948fd90",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:22.282220Z",
     "start_time": "2022-02-20T08:58:22.219337Z"
    }
   },
   "outputs": [],
   "source": [
    "model_B = keras.models.Sequential()\n",
    "model_B.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "for hidden in [300, 300 ,100, 100, 50]:\n",
    "    model_B.add(keras.layers.Dense(hidden, activation='selu'))\n",
    "model_B.add(keras.layers.Dense(1, activation='sigmoid'))\n",
    "\n",
    "model_B.compile(loss='binary_crossentropy',\n",
    "               optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "               metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "50ec9bf4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:24.287772Z",
     "start_time": "2022-02-20T08:58:22.427779Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "7/7 [==============================] - 1s 29ms/step - loss: 0.7358 - accuracy: 0.6000 - val_loss: 0.5554 - val_accuracy: 0.7191\n",
      "Epoch 2/10\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.4615 - accuracy: 0.8000 - val_loss: 0.3736 - val_accuracy: 0.8631\n",
      "Epoch 3/10\n",
      "7/7 [==============================] - 0s 13ms/step - loss: 0.3064 - accuracy: 0.9200 - val_loss: 0.2798 - val_accuracy: 0.9118\n",
      "Epoch 4/10\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.2272 - accuracy: 0.9500 - val_loss: 0.2298 - val_accuracy: 0.9412\n",
      "Epoch 5/10\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.1823 - accuracy: 0.9650 - val_loss: 0.1943 - val_accuracy: 0.9604\n",
      "Epoch 6/10\n",
      "7/7 [==============================] - 0s 15ms/step - loss: 0.1516 - accuracy: 0.9750 - val_loss: 0.1706 - val_accuracy: 0.9686\n",
      "Epoch 7/10\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.1307 - accuracy: 0.9850 - val_loss: 0.1569 - val_accuracy: 0.9655\n",
      "Epoch 8/10\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.1169 - accuracy: 0.9850 - val_loss: 0.1412 - val_accuracy: 0.9746\n",
      "Epoch 9/10\n",
      "7/7 [==============================] - 0s 12ms/step - loss: 0.1035 - accuracy: 0.9850 - val_loss: 0.1283 - val_accuracy: 0.9787\n",
      "Epoch 10/10\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.0931 - accuracy: 0.9850 - val_loss: 0.1194 - val_accuracy: 0.9797\n"
     ]
    }
   ],
   "source": [
    "history = model_B.fit(X_train_B, y_train_B, epochs=10, validation_data=(X_valid_B, y_valid_B))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e28bb33f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:24.476266Z",
     "start_time": "2022-02-20T08:58:24.461307Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_3\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " flatten_3 (Flatten)         (None, 784)               0         \n",
      "                                                                 \n",
      " dense_9 (Dense)             (None, 300)               235500    \n",
      "                                                                 \n",
      " dense_10 (Dense)            (None, 300)               90300     \n",
      "                                                                 \n",
      " dense_11 (Dense)            (None, 100)               30100     \n",
      "                                                                 \n",
      " dense_12 (Dense)            (None, 100)               10100     \n",
      "                                                                 \n",
      " dense_13 (Dense)            (None, 50)                5050      \n",
      "                                                                 \n",
      " dense_14 (Dense)            (None, 8)                 408       \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 371,458\n",
      "Trainable params: 371,458\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model_A.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "bc82bccf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:24.633850Z",
     "start_time": "2022-02-20T08:58:24.619883Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_4\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " flatten_4 (Flatten)         (None, 784)               0         \n",
      "                                                                 \n",
      " dense_15 (Dense)            (None, 300)               235500    \n",
      "                                                                 \n",
      " dense_16 (Dense)            (None, 300)               90300     \n",
      "                                                                 \n",
      " dense_17 (Dense)            (None, 100)               30100     \n",
      "                                                                 \n",
      " dense_18 (Dense)            (None, 100)               10100     \n",
      "                                                                 \n",
      " dense_19 (Dense)            (None, 50)                5050      \n",
      "                                                                 \n",
      " dense_20 (Dense)            (None, 1)                 51        \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 371,101\n",
      "Trainable params: 371,101\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model_B.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6bcc30f3",
   "metadata": {},
   "source": [
    "中间层完全一致"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4dff7508",
   "metadata": {},
   "source": [
    "### 迁移"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "882f95de",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:24.850267Z",
     "start_time": "2022-02-20T08:58:24.805386Z"
    }
   },
   "outputs": [],
   "source": [
    "# 重用除输出层以外所有层，输出层定义为二分类类型\n",
    "model_B_on_A = keras.models.Sequential(model_A.layers[:-1])  # [:-1]\n",
    "model_B_on_A.add(keras.layers.Dense(1, activation='sigmoid'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "12e918ce",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:25.116862Z",
     "start_time": "2022-02-20T08:58:25.024802Z"
    }
   },
   "outputs": [],
   "source": [
    "# 此时B与A共享一些层，要保留原始model_A，则需要克隆一个model_A，把克隆模型层公用给model_B\n",
    "model_A_clone = keras.models.clone_model(model_A)  # 注意不会克隆权重\n",
    "model_A_clone.set_weights(model_A.get_weights()) # 还原权重\n",
    "\n",
    "model_B_on_A = keras.models.Sequential(model_A_clone.layers[:-1])\n",
    "model_B_on_A.add(keras.layers.Dense(1, activation=\"sigmoid\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09135f78",
   "metadata": {},
   "source": [
    "由于输出层的参数是随机初始化的，因此刚开始训练时可能误差很大，进而影响其他重用的权重，一种方法是在前几个轮次冻结重用的层，给新的层一些时间学习合理的权重，为此，将要冻结的层的相关属性更改"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "ce47ae93",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:25.290089Z",
     "start_time": "2022-02-20T08:58:25.276128Z"
    }
   },
   "outputs": [],
   "source": [
    "for layer in model_B_on_A.layers[:-1]:\n",
    "    layer.trainable = False\n",
    "\n",
    "# 每次冻结或解冻后都要编译一次\n",
    "model_B_on_A.compile(loss='binary_crossentropy',\n",
    "                    optimizer='sgd',\n",
    "                    metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "f9441b1d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:27.915694Z",
     "start_time": "2022-02-20T08:58:25.430714Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/4\n",
      "7/7 [==============================] - 0s 33ms/step - loss: 1.8894 - accuracy: 0.3550 - val_loss: 1.2227 - val_accuracy: 0.5172\n",
      "Epoch 2/4\n",
      "7/7 [==============================] - 0s 13ms/step - loss: 0.9358 - accuracy: 0.5700 - val_loss: 0.6487 - val_accuracy: 0.6643\n",
      "Epoch 3/4\n",
      "7/7 [==============================] - 0s 13ms/step - loss: 0.4957 - accuracy: 0.7550 - val_loss: 0.3740 - val_accuracy: 0.8367\n",
      "Epoch 4/4\n",
      "7/7 [==============================] - 0s 12ms/step - loss: 0.3023 - accuracy: 0.8650 - val_loss: 0.2562 - val_accuracy: 0.9351\n",
      "------------------------------------------------------------------------------------------\n",
      "Epoch 1/16\n",
      "7/7 [==============================] - 1s 30ms/step - loss: 0.2060 - accuracy: 0.9450 - val_loss: 0.1764 - val_accuracy: 0.9665\n",
      "Epoch 2/16\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.1541 - accuracy: 0.9550 - val_loss: 0.1491 - val_accuracy: 0.9797\n",
      "Epoch 3/16\n",
      "7/7 [==============================] - 0s 13ms/step - loss: 0.1306 - accuracy: 0.9700 - val_loss: 0.1285 - val_accuracy: 0.9828\n",
      "Epoch 4/16\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.1117 - accuracy: 0.9750 - val_loss: 0.1133 - val_accuracy: 0.9868\n",
      "Epoch 5/16\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.0975 - accuracy: 0.9800 - val_loss: 0.1020 - val_accuracy: 0.9888\n",
      "Epoch 6/16\n",
      "7/7 [==============================] - 0s 12ms/step - loss: 0.0869 - accuracy: 0.9850 - val_loss: 0.0929 - val_accuracy: 0.9929\n",
      "Epoch 7/16\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.0785 - accuracy: 0.9850 - val_loss: 0.0857 - val_accuracy: 0.9939\n",
      "Epoch 8/16\n",
      "7/7 [==============================] - 0s 14ms/step - loss: 0.0717 - accuracy: 0.9950 - val_loss: 0.0798 - val_accuracy: 0.9939\n",
      "Epoch 9/16\n",
      "7/7 [==============================] - 0s 13ms/step - loss: 0.0658 - accuracy: 0.9950 - val_loss: 0.0747 - val_accuracy: 0.9959\n",
      "Epoch 10/16\n",
      "7/7 [==============================] - 0s 11ms/step - loss: 0.0607 - accuracy: 1.0000 - val_loss: 0.0702 - val_accuracy: 0.9959\n",
      "Epoch 11/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0563 - accuracy: 1.0000 - val_loss: 0.0659 - val_accuracy: 0.9959\n",
      "Epoch 12/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0519 - accuracy: 1.0000 - val_loss: 0.0623 - val_accuracy: 0.9959\n",
      "Epoch 13/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0482 - accuracy: 1.0000 - val_loss: 0.0596 - val_accuracy: 0.9959\n",
      "Epoch 14/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0454 - accuracy: 1.0000 - val_loss: 0.0568 - val_accuracy: 0.9959\n",
      "Epoch 15/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0426 - accuracy: 1.0000 - val_loss: 0.0545 - val_accuracy: 0.9970\n",
      "Epoch 16/16\n",
      "7/7 [==============================] - 0s 10ms/step - loss: 0.0403 - accuracy: 1.0000 - val_loss: 0.0525 - val_accuracy: 0.9970\n"
     ]
    }
   ],
   "source": [
    "history = model_B_on_A.fit(X_train_B, y_train_B, epochs=4,\n",
    "                           validation_data=(X_valid_B, y_valid_B))  # 先训练四次\n",
    "\n",
    "for layer in model_B_on_A.layers[:-1]:  # 解冻\n",
    "    layer.trainable = True\n",
    "\n",
    "model_B_on_A.compile(loss=\"binary_crossentropy\",\n",
    "                     optimizer=keras.optimizers.SGD(learning_rate=1e-3),\n",
    "                     metrics=[\"accuracy\"])  # 重新编译\n",
    "print('------------------------------------------------------------------------------------------')\n",
    "history = model_B_on_A.fit(X_train_B, y_train_B, epochs=16,\n",
    "                           validation_data=(X_valid_B, y_valid_B))  # 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "030e1a3d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:28.248372Z",
     "start_time": "2022-02-20T08:58:28.076830Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "63/63 [==============================] - 0s 2ms/step - loss: 0.0552 - accuracy: 0.9940: 0s - loss: 0.0548 - accuracy: 0.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.05521632358431816, 0.9940000176429749]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_B_on_A.evaluate(X_test_B, y_test_B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "5098b598",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:28.559893Z",
     "start_time": "2022-02-20T08:58:28.420258Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "63/63 [==============================] - 0s 1ms/step - loss: 0.1123 - accuracy: 0.9840\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.11230449378490448, 0.984000027179718]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_B.evaluate(X_test_B, y_test_B)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc699dc8",
   "metadata": {},
   "source": [
    "model_B_on_A 精度更高"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f8b6aa4",
   "metadata": {},
   "source": [
    "## 无监督预训练"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44917791",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-16T09:29:47.671896Z",
     "start_time": "2022-02-16T09:29:47.656932Z"
    }
   },
   "source": [
    "先用无监督学习对无标记数据进行训练，然后使用有监督学习技术对有标记数据进行最后的微调，无监督部分可以一次训练一层，也可以直接训练整个模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "36d84522",
   "metadata": {},
   "source": [
    "## 辅助任务的预训练"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c044071",
   "metadata": {},
   "source": [
    "如果没有太多标记的数据，最后一个选择是在辅助任务上训练第一个神经网络，例如，如果要构建一个识别人脸的系统，每个人可能只有几张图片，显然不足以训练一个较好的分类器。但是可以在网络上手机很多随机人物照片，然后训练第一个神经网络来检测两个不同的图片是否为他一个人，这样的网络将会学习到很好的人脸分类特征检测器，然后重用器较低层，可以用很少的训练数据来训练一个比较好的人脸分类器。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04031295",
   "metadata": {},
   "source": [
    "# 更快的优化器"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a066f66",
   "metadata": {},
   "source": [
    "除了初始化策略、良好的激活函数、批量归一化和重用网络外，使用更快的优化器也可以提升速度。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c23efa26",
   "metadata": {},
   "source": [
    "## 动量优化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5746bd3",
   "metadata": {},
   "source": [
    "$常规梯度下降，梯度为\\theta，则更新公式：\\\\ \\theta \\leftarrow \\theta- \\nabla_{\\theta}J(\\theta)$\n",
    "\n",
    "$动量算法，增加动量参数m:\\\\ 1.~m \\leftarrow \\beta m - \\eta \\nabla_\\theta J(\\theta)\\\\\n",
    "2. ~\\theta \\leftarrow \\theta+m \\\\ 如果梯度保持不变，当\\beta为0.9时，最终梯度变化将比原来的梯度快10倍，\\\\因为权重0.9是前一次动量的参数，权重更大，若新的梯度与原来的梯度方向一致就会加速$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "0c349ea1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:34.113346Z",
     "start_time": "2022-02-20T08:58:34.094449Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9)  # 设定动量参数即可实现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7f37f38",
   "metadata": {},
   "source": [
    "## Nesterov加速梯度（牛顿动量优化）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8803fd97",
   "metadata": {},
   "source": [
    "相对于传统动量优化，他不是在局部位置计算梯度$\\nabla_{\\theta}J(\\theta)$，而是在梯度更靠前的位置，$\\nabla_{\\theta}J(\\theta+\\beta m)$，因为梯度一般面对的是正确的方向"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "26db8294",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:34.586121Z",
     "start_time": "2022-02-20T08:58:34.576109Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.SGD(learning_rate=0.001, momentum=0.9, nesterov=True) # 设定牛顿参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3787d08",
   "metadata": {},
   "source": [
    "## AdaGrad（适应梯度法）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30c431e2",
   "metadata": {},
   "source": [
    "$\n",
    "1.~s \\leftarrow s + \\nabla_\\theta J(\\theta) \\otimes \\nabla_\\theta J(\\theta)\\\\\n",
    "2. ~\\theta \\leftarrow \\theta - \\eta\\nabla_{\\theta}J(\\theta)\\oslash\\sqrt{s+\\epsilon}\n",
    "$\n",
    "\n",
    "$\\epsilon是避免除以0的平滑项，通常设置为10^{-10}$\n",
    "\n",
    "简而言之，该算法会降低学习率，但是对于陡峭的维度，它的执行速度要比对缓慢下降的维度的执行速度要快，这称为自适应学习率，它有助于将结果更新更直接的指向全局最优解，并且几乎不需要调整学习率超参数 $\\eta$ 。\n",
    "\n",
    "对于简单的二次问题，表现较好，但在训练神经网络时往往在全局最优解之前完全停止了，因此不建议使用它来训练深度神经网络。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74bc6ca3",
   "metadata": {},
   "source": [
    "## RMSProp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e91cdd1",
   "metadata": {},
   "source": [
    "$\n",
    "1.~s \\leftarrow \\beta s + (1-\\beta)\\nabla_\\theta J(\\theta) \\otimes \\nabla_\\theta J(\\theta)\\\\\n",
    "2. ~\\theta \\leftarrow \\theta - \\eta\\nabla_{\\theta}J(\\theta)\\oslash\\sqrt{s+\\epsilon}\n",
    "$\n",
    "\n",
    "加入了新参数：衰减率 $\\beta$，通常取0.9，且效果很好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "abc81c14",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:35.430231Z",
     "start_time": "2022-02-20T08:58:35.420215Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.RMSprop(learning_rate=0.001, rho=0.9)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80238423",
   "metadata": {},
   "source": [
    "## Adam和Nadam优化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76e1bfa5",
   "metadata": {},
   "source": [
    "$\n",
    "1.~m \\leftarrow \\beta m + (1-\\beta_1) \\nabla_\\theta J(\\theta)\\\\\n",
    "2.~s \\leftarrow \\beta s+(1-\\beta_2)\\nabla_\\theta J(\\theta)\\otimes\\nabla_\\theta J(\\theta)\\\\\n",
    "3.~\\hat{m} \\leftarrow \\frac{m}{1-\\beta_1^t}\\\\\n",
    "4.~\\hat{s} \\leftarrow \\frac{s}{1-\\beta_2^t}\\\\\n",
    "5.~\\theta \\leftarrow \\theta - \\eta\\hat{m}\\oslash\\sqrt{\\hat{s}+\\epsilon}\n",
    "$\n",
    "\n",
    "$\\epsilon$默认为$10^{-7}$，$\\beta_1$通常初始化为0.9，$\\beta_2$通常倍初始化为0.999"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "a8780a8e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:35.978927Z",
     "start_time": "2022-02-20T08:58:35.971947Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.1, beta_2=0.999)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edf10f53",
   "metadata": {},
   "source": [
    "> 自适应优化方法，包括（RMSProp，Adam，Nadam优化）通常可以快速收敛到好的解决方案，然而它们也会导致在某些数据集上泛化不佳的情况，因此如果性能不太好，可以尝试改用普通的Nesterov加速梯度。此外还可以查新的研究，其发展很快"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38a7ae1a",
   "metadata": {},
   "source": [
    "## 学习率调度"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04bd72a5",
   "metadata": {},
   "source": [
    "学习率设置太低，训练最终会收敛到最优解，但是将花费很长时间；如果设置太高，它可能会围着最优解震荡，不会稳定下来"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "724d95bf",
   "metadata": {},
   "source": [
    "1. keras中实现幂调度\n",
    "\n",
    "$\\eta(t)=\\frac{\\eta_0}{(1+t/s)^c}$\n",
    "\n",
    "初试学习率$\\eta_0$，幂$c$（通常为1），步骤$s$是超参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "456d3fbe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:36.937233Z",
     "start_time": "2022-02-20T08:58:36.917247Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer = keras.optimizers.SGD(learning_rate=0.01, decay=1e-4) # keras假定c为1，decay是s的倒数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2949e85c",
   "metadata": {},
   "source": [
    "2. 指数调度，需要定义一个函数，该函数采用当前轮次并返回学习率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "25e8f247",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:37.294272Z",
     "start_time": "2022-02-20T08:58:37.289286Z"
    }
   },
   "outputs": [],
   "source": [
    "def exponential_decay_fn(epoch):\n",
    "    return 0.01 * 0.1**(epoch / 20)  # 其中0.01是eta，20是s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "551c87be",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:37.483765Z",
     "start_time": "2022-02-20T08:58:37.465813Z"
    }
   },
   "outputs": [],
   "source": [
    "# 如果不想对eta和s硬编码，可以创建一个返回配置函数的函数\n",
    "def exponential_decay(lr0, s):\n",
    "    def exponential_decay_fn(epoch):\n",
    "        return lr0 * 0.1**(epoch / s)\n",
    "    return exponential_decay_fn\n",
    "exponential_decay_fn = exponential_decay(lr0=0.01, s=20)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1cf9c5cd",
   "metadata": {},
   "source": [
    "创建一个LearningRateScheduler回调函数，为其提供调度函数，然后将此回调函数传递给fit()方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "09c7057b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T08:58:37.844803Z",
     "start_time": "2022-02-20T08:58:37.827844Z"
    }
   },
   "outputs": [],
   "source": [
    "lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21f272d0",
   "metadata": {},
   "source": [
    "```\n",
    "history = model.fit(X_train_scaled, y_train, [...], callbacks=[lr_scheduler])\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bf7395d",
   "metadata": {},
   "source": [
    "其他详细内容参考书320页，https://github.com/ageron/handson-ml/blob/master/11_deep_learning.ipynb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f92390b3",
   "metadata": {},
   "source": [
    "# 通过正则化避免过拟合"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c329da6",
   "metadata": {},
   "source": [
    "## l1和l2正则化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "ac28068c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T09:10:31.250611Z",
     "start_time": "2022-02-20T09:10:31.239647Z"
    }
   },
   "outputs": [],
   "source": [
    "layer = keras.layers.Dense(100, activation='elu', \n",
    "                           kernel_initializer='he_normal', \n",
    "                           kernel_regularizer=keras.regularizers.l2(0.01))  # l2正则化因子0.01\n",
    "# 也可以使用keras.regularizers.l2(a)或keras.regularizers.l1_l2(a, b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "f2f48917",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T09:28:31.102063Z",
     "start_time": "2022-02-20T09:28:31.095044Z"
    }
   },
   "outputs": [],
   "source": [
    "# functools.partial()可以改变或赋予某函数默认参数，如func2 = partial(func, a=1)就是fun2等同于a参数为1的func函数\n",
    "\n",
    "from functools import partial\n",
    "RegularizedDense = partial(keras.layers.Dense, \n",
    "                          activation='elu',\n",
    "                          kernel_initializer='he_normal',\n",
    "                          kernel_regularizer=keras.regularizers.l2(0.01))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "a491b8b0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T09:28:44.008326Z",
     "start_time": "2022-02-20T09:28:43.967456Z"
    }
   },
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    RegularizedDense(300),\n",
    "    RegularizedDense(100),\n",
    "    RegularizedDense(10, activation='softmax',\n",
    "                    kernel_initializer='glorot_uniform')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "0190f95e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T11:07:06.576404Z",
     "start_time": "2022-02-20T11:07:06.554440Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=\"nadam\", metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "3afa8fe1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T11:08:21.912711Z",
     "start_time": "2022-02-20T11:07:07.253477Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1719/1719 [==============================] - 9s 5ms/step - loss: 0.4912 - accuracy: 0.8214 - val_loss: 0.4267 - val_accuracy: 0.8420\n",
      "Epoch 2/10\n",
      "1719/1719 [==============================] - 8s 4ms/step - loss: 0.4350 - accuracy: 0.8397 - val_loss: 0.3511 - val_accuracy: 0.8704\n",
      "Epoch 3/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.4084 - accuracy: 0.8463 - val_loss: 0.3606 - val_accuracy: 0.8652\n",
      "Epoch 4/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3928 - accuracy: 0.8530 - val_loss: 0.3244 - val_accuracy: 0.8802\n",
      "Epoch 5/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3791 - accuracy: 0.8586 - val_loss: 0.3291 - val_accuracy: 0.8792\n",
      "Epoch 6/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3684 - accuracy: 0.8622 - val_loss: 0.3265 - val_accuracy: 0.8814\n",
      "Epoch 7/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3583 - accuracy: 0.8649 - val_loss: 0.3255 - val_accuracy: 0.8806\n",
      "Epoch 8/10\n",
      "1719/1719 [==============================] - 8s 5ms/step - loss: 0.3508 - accuracy: 0.8682 - val_loss: 0.3065 - val_accuracy: 0.8860\n",
      "Epoch 9/10\n",
      "1719/1719 [==============================] - 8s 5ms/step - loss: 0.3459 - accuracy: 0.8697 - val_loss: 0.2964 - val_accuracy: 0.8942\n",
      "Epoch 10/10\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3374 - accuracy: 0.8728 - val_loss: 0.3041 - val_accuracy: 0.8862\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ab3c221",
   "metadata": {},
   "source": [
    " ## dropout"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8559a7e",
   "metadata": {},
   "source": [
    "每一个神经元都有被暂时删除的概率，在该轮不参加训练，下一轮参加训练，超参数p称为dropout率，通常设置在10%到50%，在CNN接近20%\\~30%，RNN接近40%\\~50%。训练结束后，神经元不再被删除。\n",
    "\n",
    "该种技术甚至可以将最先进的神经网络提升1\\~2%精确度。\n",
    "\n",
    "> 实践中，通常只可以对第一层至第三层（不包括输出层）的神经元应用dropout"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "93f8a13f",
   "metadata": {},
   "source": [
    " 有一个需要注意的技术细节，假设p=50%，在测试中，一个神经元被连接到输入神经元的数量是训练期间（平均）的两倍，为了弥补这一事实，需要在训练后将每个神经元的输入连接权重乘以0.5，否则每个神经元得到的总输入信号大约是网络训练时的两倍，表现可能不会很好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "11bdfbc8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T10:46:09.708896Z",
     "start_time": "2022-02-20T10:46:09.658022Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用0.2的dropout率在每个Dense层之前应用dropout正则化，它将丢弃一些输入，将剩下的输入传递到下一层\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dropout(rate=0.2),\n",
    "    keras.layers.Dense(300, activation='elu', kernel_initializer='he_normal'),\n",
    "    keras.layers.Dropout(rate=0.2),\n",
    "    keras.layers.Dense(100, activation='elu', kernel_initializer='he_normal'),\n",
    "    keras.layers.Dropout(rate=0.2),\n",
    "    keras.layers.Dense(10, activation='softmax')\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "4146d7b4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T10:49:19.228808Z",
     "start_time": "2022-02-20T10:48:37.987455Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "1719/1719 [==============================] - 5s 2ms/step - loss: 0.7821 - accuracy: 0.7215 - val_loss: 0.5131 - val_accuracy: 0.8206\n",
      "Epoch 2/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.5771 - accuracy: 0.7925 - val_loss: 0.4620 - val_accuracy: 0.8386\n",
      "Epoch 3/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.5388 - accuracy: 0.8065 - val_loss: 0.4572 - val_accuracy: 0.8356\n",
      "Epoch 4/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.5161 - accuracy: 0.8128 - val_loss: 0.4222 - val_accuracy: 0.8540\n",
      "Epoch 5/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.4978 - accuracy: 0.8192 - val_loss: 0.4090 - val_accuracy: 0.8560\n",
      "Epoch 6/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.4865 - accuracy: 0.8243 - val_loss: 0.4006 - val_accuracy: 0.8596\n",
      "Epoch 7/10\n",
      "1719/1719 [==============================] - 4s 3ms/step - loss: 0.4766 - accuracy: 0.8249 - val_loss: 0.3974 - val_accuracy: 0.8586\n",
      "Epoch 8/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.4670 - accuracy: 0.8305 - val_loss: 0.3924 - val_accuracy: 0.8632\n",
      "Epoch 9/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.4623 - accuracy: 0.8317 - val_loss: 0.3833 - val_accuracy: 0.8614\n",
      "Epoch 10/10\n",
      "1719/1719 [==============================] - 4s 2ms/step - loss: 0.4540 - accuracy: 0.8339 - val_loss: 0.3808 - val_accuracy: 0.8630\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss='sparse_categorical_crossentropy',\n",
    "             optimizer=keras.optimizers.SGD(learning_rate=0.01),\n",
    "             metrics=['accuracy'])\n",
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e61bf2eb",
   "metadata": {},
   "source": [
    "过拟合可以提高dropout率，欠拟合降低dropout率，此外许多新构架仅在在最后一个隐藏层之后才使用dropout\n",
    "\n",
    "如果要基于SELU激活函数，则应该使用alpha dropout，它保留了其输入的均值和标准差\n",
    "\n",
    "```\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.AlphaDropout(rate=0.2),\n",
    "    keras.layers.Dense(300, activation=\"selu\", kernel_initializer=\"lecun_normal\"),\n",
    "    keras.layers.AlphaDropout(rate=0.2),\n",
    "    keras.layers.Dense(100, activation=\"selu\", kernel_initializer=\"lecun_normal\"),\n",
    "    keras.layers.AlphaDropout(rate=0.2),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])\n",
    "optimizer = keras.optimizers.SGD(learning_rate=0.01, momentum=0.9, nesterov=True)\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=optimizer, metrics=[\"accuracy\"])\n",
    "n_epochs = 20\n",
    "history = model.fit(x_train_scaled, y_train, epochs=n_epochs,\n",
    "                    validation_data=(x_valid_scaled, y_valid))\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd3bf5ce",
   "metadata": {},
   "source": [
    "## 蒙特卡洛 Dropout\n",
    "\n",
    "详见书325，https://github.com/ageron/handson-ml2/blob/master/11_training_deep_neural_networks.ipynb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "e061256f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T11:36:04.238193Z",
     "start_time": "2022-02-20T11:36:04.232265Z"
    }
   },
   "outputs": [],
   "source": [
    "class MCDropout(keras.layers.Dropout):\n",
    "    def call(self, inputs):\n",
    "        return super().call(inputs, training=True)\n",
    "\n",
    "class MCAlphaDropout(keras.layers.AlphaDropout):\n",
    "    def call(self, inputs):\n",
    "        return super().call(inputs, training=True)\n",
    "# 重写Dropout的call()函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4785b9e5",
   "metadata": {},
   "source": [
    "## 最大范数正则化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f560b50",
   "metadata": {},
   "source": [
    "r是最大范数超参数，减小r会增加正则化的数量，并且有助于减少过拟合，最大范数正则化还可以帮助缓解不稳定的梯度问题（如果没用批量归一化）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "e603194a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-02-20T11:42:54.573463Z",
     "start_time": "2022-02-20T11:42:38.240202Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/2\n",
      "1719/1719 [==============================] - 9s 5ms/step - loss: 0.4707 - accuracy: 0.8345 - val_loss: 0.3867 - val_accuracy: 0.8596\n",
      "Epoch 2/2\n",
      "1719/1719 [==============================] - 7s 4ms/step - loss: 0.3525 - accuracy: 0.8728 - val_loss: 0.3872 - val_accuracy: 0.8652\n"
     ]
    }
   ],
   "source": [
    "layer = keras.layers.Dense(100, activation=\"selu\", kernel_initializer=\"lecun_normal\",\n",
    "                           kernel_constraint=keras.constraints.max_norm(1.))\n",
    "MaxNormDense = partial(keras.layers.Dense,\n",
    "                       activation=\"selu\", kernel_initializer=\"lecun_normal\",\n",
    "                       kernel_constraint=keras.constraints.max_norm(1.))\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    MaxNormDense(300),\n",
    "    MaxNormDense(100),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\", optimizer=\"nadam\", metrics=[\"accuracy\"])\n",
    "n_epochs = 2\n",
    "history = model.fit(X_train_scaled, y_train, epochs=n_epochs,\n",
    "                    validation_data=(X_valid_scaled, y_valid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ec90be0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "255.038px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
